package com.sky.demo;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import org.apache.ibatis.io.Resources;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * EasyExcel入门案例
 *
 * @Author Vsunks.v
 * @Date 2023/5/14 11:05
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: EasyExcel入门案例
 */
public class EasyExcelDemo {

    public static void main(String[] args) throws IOException {


        // 演示读
        // read();

        // 演示写
        // write();
        // 演示使用模板填充
        // fill();

        // 填充集合
        // fillList();

    }




    // 填充集合
    private static void fillList() {
        // 1. 准备模板文件的路径
        String templateNameWithPath = "D:\\Develop\\WokKStation\\sky-take-out71\\sky-server\\src" +
                "\\main\\resources\\templates\\template2.xlsx";
        // 准备生成一个文件路径/file对象/输出流对象
        String fileNameWithPath = "D:\\Develop\\WokKStation\\sky-take-out71\\sky-server\\src" +
                "\\main\\resources\\templates\\fillList" + System.currentTimeMillis() + ".xlsx";


        // 2. 调用api完成填充的操作
        // 配置填充后写入文件的位置，写入数据所属类的类型
        EasyExcel.write(fileNameWithPath, ExcelData.class)
                // 指定模板文件
                .withTemplate(templateNameWithPath)
                // 使用默认的工作表
                .sheet()
                // 填充
                .doFill(genData());
    }
    // 填充单个
    private static void fill() {
        // 1. 准备模板文件的路径
        String templateNameWithPath = "D:\\Develop\\WokKStation\\sky-take-out71\\sky-server\\src" +
                "\\main\\resources\\templates\\template1.xlsx";
        // 准备生成一个文件路径/file对象/输出流对象
        String fileNameWithPath = "D:\\Develop\\WokKStation\\sky-take-out71\\sky-server\\src" +
                "\\main\\resources\\templates\\fillsingle" + System.currentTimeMillis() + ".xlsx";


        // 2. 调用api完成填充的操作
        // 配置填充后写入文件的位置，写入数据所属类的类型
        EasyExcel.write(fileNameWithPath, ExcelData.class)
                // 指定模板文件
                .withTemplate(templateNameWithPath)
                // 使用默认的工作表
                .sheet()
                // 填充
                .doFill(ExcelData.builder().name("李四").birthday(new Date()).height(180.0).build());
    }

    // 演示写
    private static void write() {
        // 准备一个文件路径/file对象/输出流对象
        String fileNameWithPath = "D:\\Develop\\WokKStation\\sky-take-out71\\sky-server\\src" +
                "\\main\\resources\\templates\\wireteDemo.xlsx";


        // 调用api完成写的操作
        // 配置要写入的文件路径和数据所属类的类型
        EasyExcel.write(fileNameWithPath, ExcelData.class)
                // 配置要写入的工作簿中的指定的工作表
                .sheet("写入案例")
                // 将集合数据写入excel文件
                .doWrite(genData());
    }


    /**
     * 演示读 since 2.+
     *
     * @throws IOException
     */
    private static void read() throws IOException {
        // 1. 创建流对象，关联要读取的文件
        InputStream file = Resources.getResourceAsStream("templates/demo.xlsx");
        // 2. 使用EasyExcel主类提供的read方法，关联文件、到封装到的实体类类型、读取完之后如何处理
        // 第三个参数Listener在读取成功后会自动调用
        EasyExcel.read(file, ExcelData.class, new AnalysisEventListener() {
                    // 每读一行，就会自动执行一次invoke方法。读取的数据封装在data中
                    @Override
                    public void invoke(Object data, AnalysisContext context) {
                        System.out.println("data = " + data);
                    }

                    // 读完之后自动执行该方法
                    @Override
                    public void doAfterAllAnalysed(AnalysisContext context) {
                        System.out.println("文件解析完成");
                    }
                })
                // 读取第一个工作表
                .sheet()
                // 读，按照上述设置好的参数读
                .doRead();
    }


    /**
     * 演示读 since 3.+
     *
     * @throws IOException
     */
   /*  private static void read() throws IOException {
        // 1. 创建流对象，关联要读取的文件
        InputStream file = Resources.getResourceAsStream("templates/demo.xlsx");
        // 2. 使用EasyExcel主类提供的read方法，关联文件、到封装到的实体类类型、读取完之后如何处理
        // 第三个参数Listener在读取成功后会自动调用
        EasyExcel.read(file, ExcelData.class, new PageReadListener<ExcelData>(dataList -> {
                    for (ExcelData excelData : dataList) {
                        System.out.println("excelData = " + excelData);
                    }
                }))
                // 读取第一个工作表
                .sheet()
                // 读，按照上述设置好的参数读
                .doRead();
    } */


    public static List<ExcelData> genData() {
        // 创建集合
        ArrayList<ExcelData> excelDatas = new ArrayList<>();

        // 生成数据并存入集合
        for (int i = 0; i < 15; i++) {
            ExcelData data = ExcelData.builder()
                    .name("张三" + i)
                    .birthday(new Date())
                    .height(170.0 + i)
                    .build();
            excelDatas.add(data);
        }
        // 返回
        return excelDatas;
    }

}
